﻿using System;
using System.Data;
using System.Windows.Forms;
using System.Collections.Generic;

namespace GUI
{
    /// <summary>
    /// Form ouvert depuis La MainForm
    /// Permet l'ajout/modification d'un produit (selon les données qui lui sont passées)
    /// </summary>
    public partial class ProductEditForm : Form
    {
        private CurrencyManager cm;
        private DataRowView productDV;
        private DataSet ds;

        public ProductEditForm(CurrencyManager cm, DataSet ds)
        {
            InitializeComponent();
            this.cm = cm;
            this.ds = ds;
        }

        private void ProductEditForm_Load(object sender, EventArgs e)
        {
            PopulateAndBind();
        }

        /// <summary>
        /// Déclenché au chargement de la Form
        /// Mise en place des liaisons des données
        /// </summary>
        private void PopulateAndBind()
        {
            productDV = (DataRowView)cm.Current;

            txtProductID.DataBindings.Add("Text", productDV, "productid");

            //Création d'une liste déroulante permetant de choisir la catégorie du produit
            cboCategory.DataSource = ds;
            cboCategory.ValueMember = "category.categoryid";
            cboCategory.DisplayMember = "category.name";
            cboCategory.SelectedValue = productDV["categoryid"];

            txtProductName.DataBindings.Add("Text", productDV, "name");
            txtProductDescription.DataBindings.Add("Text", productDV, "description");

            // Empêche une exception quand on crée un nouveau produit (valeurs reçues sont à null)
            Binding reportsToBinding = numProductPrice.DataBindings.Add("Value", productDV, "price", true);
            reportsToBinding.NullValue = 1;

            reportsToBinding = numProductStock.DataBindings.Add("Value", productDV, "stock",true);
            reportsToBinding.NullValue = 1;

            reportsToBinding = chkPromo.DataBindings.Add("checked", productDV, "promo", true);
            reportsToBinding.NullValue = 1;
        }

        /// <summary>
        /// Valide les données entrées dans la Form
        /// </summary>
        /// <param name="sender">object sender</param>
        /// <param name="e">EventArgs e</param>
        private void btnSave_Click(object sender, EventArgs e)
        {
            //Le champ cboCategory n'est pas utilisé pour le DataBinding, il faut donc lui attribuer la catégorie selectionnée
            productDV["categoryid"] = cboCategory.SelectedValue;

            //Permet d'éviter une exception lors de l'insertion des données dans la db si la checkbox promo n'a pas été cochée (elle renvoie null)
            if (productDV["promo"].ToString() == "")
                productDV["promo"] = 0;

            //Permet d'éviter une exception lors de l'insertion des données dans la db le stock a été laissé par defaut (renvoie null)
            if (productDV["stock"].ToString() == "")
                productDV["stock"] = 0;       

            if (txtProductName.Text.Trim() == "")
            {
                MessageBox.Show("Le nom du produit ne peut pas être vide.", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtProductName.Text = "";
                txtProductName.Focus();
            }
            else if (numProductPrice.Value == 0)
            {
                MessageBox.Show("Le prix du produit doit être supérieur à zéro.", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
                numProductPrice.Value = 0;
                numProductPrice.Focus();
            }
            else
            {
                DataTable productDT = new DataTable();
                productDT = BU.ProductManager.Fetch();   

                //Compare la valeur entrée dans txtProductName avec les noms déjà présents dans la db pour empêcher les doublons (valeur Name à Unique dans la db)
                bool edit = true;
                for (int i = 0; i < productDT.Rows.Count; i++)
                    if (txtProductName.Text.ToString().ToLowerInvariant() == productDT.Rows[i]["name"].ToString().ToLowerInvariant())
                    {
                        edit = false;
                        if (productDV["productid"].ToString() == productDT.Rows[i]["productid"].ToString())
                        {
                            edit = true;
                        }
                    }

                if (edit == false)
                {
                    MessageBox.Show("Ce nom de produit est déjà utilisé.", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    txtProductName.Text = "";
                    txtProductName.Focus();
                }
                else
                {
                    cm.EndCurrentEdit();
                    DialogResult = DialogResult.OK;
                    this.Close();
                }
            }
        }

        /// <summary>
        /// Annule les modifications apportées et renvoie DialogResult.Cancel à la MainForm (pas de modification des données)
        /// </summary>
        /// <param name="sender">object sender</param>
        /// <param name="e">EventArgs e</param>
        private void btnCancel_Click(object sender, EventArgs e)
        {
            cm.CancelCurrentEdit();
            DialogResult = DialogResult.Cancel;
            this.Close();
        }

        /// <summary>
        /// Permet de bien annuler les modifications entrées si l'utilisateur ferme la fenêtre non pas avec le bouton annuler mais avec la croix
        /// </summary>
        /// <param name="sender">object sender</param>
        /// <param name="e">FormClosingEventArgs e</param>
        private void ProductEditForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            cm.CancelCurrentEdit();
        }
    }
}
